package com.nekonomics
package api.dto.response

import com.nekonomics.error.AppError
import zio.json.*

/**
 * 通用的api响应封装，错误码为0，表示成功，否则表示失败。支持传递dto数据
 * @tparam T dto类型
 */
private case class ApiRsp[T](code: Int, data: Option[T]) derives JsonEncoder

/**
 *
 * @tparam T belongs to this typeclass
 */


trait RspEncoder[T] {
  def dtoToRsp(code: Int, data: T): ApiRsp[T]
}


object RspEncoder {
  
  given [T: JsonEncoder]: RspEncoder[T] with {
    def dtoToRsp(code: Int, data: T): ApiRsp[T] = ApiRsp(code, data = Some(data))
  }

  extension [T: {RspEncoder, JsonEncoder}](data: T) {
    def toRsp: ApiRsp[T] = {
      summon[RspEncoder[T]].dtoToRsp(0, data)
    }
//    def toErrRsp[E <: AppError]: ApiRsp
    
  }

}